YOLOv7部署加速比5.89,BERT部署加速比6.37,自动化压缩工具实战30+热门AI模型
利用ACT中的结构化稀疏和蒸馏量化技术量化训练ERNIE3.0模型,与原始的FP32对比,INT8量化后的模型减小185%,在NVIDIA GPU上推理加速6.37倍。
研发「模型自动压缩工具」的动机和思考
结构化稀疏与量化技术解析
量化蒸馏训练实战(以YOLOv7为例)
结构化稀疏与量化实战(以BERT为例)
推理部署
未来工作展望
传送门
https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression
扫码加入自动压缩群,享超多福利
研发模型自动压缩工具
的动机和思考
模型剪枝是模型压缩的重要手段,在实际使用中有如下2点困难:
直接使用剪枝损失比较大,无法满足精度要求
模型剪枝需要修改训练代码,操作复杂,技术门槛高
根据规则计算神经元的重要性; 根据重要性对模型神经元进行剪枝; 重新训练剪枝后的模型。
这些步骤需要开发者在原本的训练代码中直接调用剪枝的相关接口,并进行分步操作。通常项目工程相当复杂,修改训练代码技术复杂度高、时间成本高昂。
模型激活值分布不均匀,导致量化误差大
过度训练是导致模型激活值分布不均匀的原因之一。例如在YOLOv6s迭代过程中,为了让模型更好地收敛,通常需要延长模型训练周期。但随之也会带来一些隐患,比如模型在COCO数据集上出现了过拟合,某些层的数值分布极端化,这些状况增加了量化的噪声。我们分析了YOLOv6s每层Conv的量化精度,发现某些层精度下降的特别严重,由此导致了YOLOv6s模型离线量化后在验证集上的精度下降了10%,无法达到业务要求。
任务复杂度高,模型精度受量化误差的影响大
量化训练需修改训练代码,复杂度大,技术门槛高
相比离线量化(Post Training Quantization),量化训练能减少离线量化精度掉点的程度。量化训练方法在训练过程中,不断地调整激活的数值分布,使激活的分布更适合量化。但是,量化训练使用成本比较高,体现在以下两方面,一方面是人力成本高,为了实现量化训练,需要修改模型的组网和训练代码,插入模拟量化操作。另一方面为时间成本高,训练时需要加载完整训练集做训练。
模型自动压缩工具
量化蒸馏训练技术解析
构造教师模型
构造结构化剪枝模型
对原始模型的参数和注意力头进行重要性重排序,把重要参数和注意力头排在参数的前侧,然后对模型进行结构化剪枝,按照比例减掉不重要的参数和注意力头。结构化剪枝之后的模型作为学生模型,进行压缩训练。
添加蒸馏loss
蒸馏训练
使用原始模型的输出,来监督结构化剪枝后模型的输出,进行结构化剪枝的训练,完成整体的压缩流程。
图 结构化剪枝+蒸馏实现剪枝操作
量化策略自动选择
蒸馏量化训练(具体步骤包括如下3步,CV任务多使用该技术)
构造教师模型:加载推理模型文件,并将推理模型在内存中复制一份,作为知识蒸馏中的教师模型,原模型则作为学生模型。
添加loss:自动地分析模型结构,寻找适合添加蒸馏loss的层,一般是最后一个带可训练参数的层。比如,检测模型head有多个分支的话,会将每个head最后一个conv作为蒸馏节点。
蒸馏训练:教师模型通过蒸馏 loss 监督原模型的稀疏训练或量化训练,完成模型压缩的过程。
ACT还支持更多功能,包括离线量化超参搜索、算法自动组合和硬件感知等,来满足CV和NLP模型的各类压缩需求。功能详情以及ACT在更多场景的应用,请参见自动压缩工具首页介绍。
模型自动压缩工具
量化蒸馏训练技术实战
准备预测模型:导出ONNX模型
cd yolov7
python export.py --weights yolov7-tiny.pt --grid
准备训练数据&定义DataLoader
global_config['image_path'], transform=yolo_image_preprocess)
train_loader = paddle.io.DataLoader(
train_dataset,
batch_size=1,
shuffle=True,
drop_last=True,
num_workers=0)
定义配置文件
alpha: 1.0 # 蒸馏loss所占权重
loss: soft_label
Quantization: # 量化参数设置
use_pact: true # 是否使用PACT量化算法
activation_quantize_type: 'moving_average_abs_max' # 激活量化方式,选择'moving_average_abs_max'即可
quantize_op_types: # 需要量化的OP类型,可以是conv2d、depthwise_conv2d、mul、matmul_v2等
- conv2d
- depthwise_conv2d
TrainConfig: # 训练的配置
train_iter: 3000 # 训练的轮数
eval_iter: 1000 # 训练中每次评估精度的间隔轮数
learning_rate: 0.00001 # 训练学习率
optimizer_builder: # 优化器设置
optimizer:
type: SGD
weight_decay: 4.0e-05
开始运行
两行代码就可以开始ACT量化训练。启动ACT时,需要传入模型文件的路径(model_dir)、模型文件名(model_filename)、参数文件名称(params_filename)、压缩后模型存储路径(save_dir)、压缩配置文件(config)、dataloader和评估精度的eval_callback。
ac = AutoCompression(
model_dir=global_config["model_dir"],
model_filename=global_config["model_filename"],
params_filename=global_config["params_filename"],
save_dir=FLAGS.save_dir,
config=all_config,
train_dataloader=train_loader,
eval_callback=eval_function)
ac.compress()
模型自动压缩工具
结构化剪枝和量化实战
准备预测模型
使用PyTorch2Paddle(在X2Paddle工具箱中)直接将PyTorch动态图模型转为飞桨静态图模型;(以下代码使用该方法)
使用ONNX2Paddle将PyTorch动态图模型保存为ONNX格式后再转为飞桨静态图模型。
import torch
import numpy as np
# 将PyTorch模型设置为eval模式
torch_model.eval()
# 构建输入,
input_ids = torch.zeros([batch_size, max_length]).long()
token_type_ids = torch.zeros([batch_size, max_length]).long()
attention_msk = torch.zeros([batch_size, max_length]).long()
# 进行转换
from x2paddle.convert import pytorch2paddle
pytorch2paddle(torch_model,
save_dir='./x2paddle_cola/',
jit_type="trace",
input_examples=[input_ids, attention_msk, token_type_ids])
准备训练数据&定义DataLoader
定义配置文件
如果自动压缩针对Transformer encoder结构的模型没有指定具体的压缩策略的话,会自动选择结构化剪枝和量化进行压缩。如果想单独设置某一种压缩策略,可以参考的具体的超参设置ACT超参设置文档。
train_config = {
"epochs": 3, ### 压缩训练epoch数量
"eval_iter": 855, ### 训练多少轮数进行一次测试
"learning_rate": 1.0e-6, ### 压缩训练过程中的学习率
"optimizer_builder": { ### 优化器配置
"optimizer": {"type": "AdamW"},
"weight_decay": 0.01 ### 权重衰减值
},
"origin_metric": 0.6006 ### 压缩前模型精度,用来确认转换过来的模型和实现的dataloader是否正确
}
开始运行
### 调用自动压缩接口
ac = AutoCompression(
model_dir='./x2paddle_cola',
model_filename='model.pdmodel',
params_filename='model.pdiparams',
save_dir=save_dir,
config={'TrainConfig': train_config}, #config,
train_dataloader=train_dataloader,
eval_callback=eval_function,
eval_dataloader=eval_dataloader)
ac.compress()
以上是精简后的关键代码,若想快速体验,可根据示例文档及代码进行体验。(链接如下)
https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression/pytorch_huggingface
推理部署
https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression
模型自动压缩工具
未来工作展望
直播预告
想了解AI模型压缩策略,了解更多自动压缩工具的算法和能力,快快扫码加群关注我们的直播间吧!
直播时间
2022年11月7日(下周一)和11月8日(下周二)20:30~21:30,欢迎大家扫码报名。
补充说明
表1 测试环境与补充说明:表格mAP模型对应论文中的指标,譬如YOLOv5是在COCO测试集测试,MobileNetV3是在Imagenet数据集上测试
项目地址
GitHub:
Gitee:
WAVE SUMMIT+2022
WAVE SUMMIT+2022将于11月30日在深圳举办,欢迎大家扫码关注飞桨公众号,回复WAVE提前加入官方社群了解详情。
【WAVE SUMMIT+2022报名入口】